#include "viml/value.h"
#include <gtest/gtest.h>

namespace viml {

class ListDictTest : public ::testing::Test {
protected:
    // 可以在这里添加测试所需的设置代码
};

TEST_F(ListDictTest, ListCreation) {
    // 测试列表创建
    auto list = std::make_shared<List>();
    
    // 验证列表初始状态
    EXPECT_EQ(list->elements.size(), 0);
}

TEST_F(ListDictTest, ListAppend) {
    // 测试列表添加元素
    auto list = std::make_shared<List>();
    list->elements.push_back(std::make_shared<Value>(42.0));
    
    // 验证列表元素
    ASSERT_EQ(list->elements.size(), 1);
    EXPECT_TRUE(list->elements[0]->is_number());
    EXPECT_EQ(list->elements[0]->as_number(), 42.0);
}

TEST_F(ListDictTest, DictCreation) {
    // 测试字典创建
    auto dict = std::make_shared<Dict>();
    
    // 验证字典初始状态
    EXPECT_EQ(dict->elements.size(), 0);
}

TEST_F(ListDictTest, DictSet) {
    // 测试字典设置键值对
    auto dict = std::make_shared<Dict>();
    dict->elements["key"] = std::make_shared<Value>(42.0);
    
    // 验证字典元素
    ASSERT_EQ(dict->elements.size(), 1);
    EXPECT_TRUE(dict->elements.count("key"));
    EXPECT_TRUE(dict->elements["key"]->is_number());
    EXPECT_EQ(dict->elements["key"]->as_number(), 42.0);
}

TEST_F(ListDictTest, ListDictIntegration) {
    // 测试列表和字典的集成使用
    auto list = std::make_shared<List>();
    auto dict = std::make_shared<Dict>();
    
    // 将字典添加到列表中
    list->elements.push_back(std::make_shared<Value>(dict));
    
    // 验证结构
    ASSERT_EQ(list->elements.size(), 1);
    EXPECT_TRUE(list->elements[0]->is_dict());
    
    // 在字典中设置值
    dict->elements["inner_key"] = std::make_shared<Value>("inner_value");
    
    // 验证嵌套结构
    auto inner_dict = list->elements[0]->as_dict();
    ASSERT_TRUE(inner_dict != nullptr);
    EXPECT_TRUE(inner_dict->elements.count("inner_key"));
    EXPECT_EQ(inner_dict->elements["inner_key"]->as_string(), "inner_value");
}

} // namespace viml